import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'
//引入store:路由导航需要根据store里的信息判断
import store from '@/store'
Vue.use(VueRouter)
//重新VueRouter原型上的push解决连续点击报错问题
/*
  首先分析报错原因，push方法是用Promess封装的，需要传递成功和失败的回调，不传则会报错
*/
//备份push方法
let bfPush = VueRouter.prototype.push
//重写
VueRouter.prototype.push = function (location, resolve, reject) {
  //如果传递了成功和失败的回调则正常调用
  if (resolve && reject) {
    //call和apply都可以调用函数一次，并且改变函数的this指向（上下文），区别在于call参数用逗号隔开，apply用数组形式
    bfPush.call(this, location, resolve, reject)
  } else {
    //没传就自己传两个回调
    bfPush.call(this, location, () => { }, () => { })
  }
}
//replace方法同理

const router = new VueRouter({
  routes,
  //控制滚动条行为
  scrollBehavior() {
    return { y: 0 }
  }
})

//全局前置守卫
router.beforeEach(async (to, from, next) => {
  /*
    to:跳转后路由的信息
    from：跳转前路由的信息
    next：放行的函数,next(path)放行到指定路由，next(false)中断导航
  */
  let token = store.state.user.token
  let name = store.state.user.userInfo.name
  //如果用户已经登录
  if (token) {
    //且还想访问login
    if (to.path == '/login') {
      //默认跳到首页
      next('/home')
    } else {
      //登录了去的不是login
      //判断有无用户信息
      if (name) {
        //有信息放行
        next()
      } else {
        //没有信息，发请求获取到信息后放行
        try {
          //派发action获取用户信息
          await store.dispatch('getUserInfo')
          next()
        } catch (error) {
          //token过期失效了，服务器返回code不为200时
          //清除token回到登录页重新登录
          store.dispatch('logout')
          next('/login')
        }
      }
    }
  } else {
    //未登录不能去交易相关的界面以及个人中心 
    let toPath = to.path
    if (toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1 || toPath.indexOf('/trade') != -1) {
      //如果跳转的地址包含不能去的路径让他跳转到登录页,同时将目标路径作为query参数，登录后会跳转目标页
      next('/login?topath=' + toPath)
    } else {
      next()
    }
  }
})

export default router
